﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using main.sdk.display.object2d;
using main.sdk.utils;
using Microsoft.Xna.Framework;

namespace main.sdk.utils.animations2D
{
    /**
     * Cria uma animação para o alpha.
     * 
     * @usage
     *   // Anima o alpha de From até To.
     *   Animation2D anim = new AlphaAnimation2D(From, To, Time, Smoothness = 0);
     *   
     *   // Anima o alpha do valor atual até To.
     *   Animation2D anim = new AlphaAnimation2D(To, Time, Smoothness = 0);
     */
    public class AlphaAnimation2D : Animation2D
    {
        #region Variables

        private Counter  m_CounterAlpha = new Counter();
        private double   m_From;
        private double   m_To;
        private double   m_Time;
        private int      m_Smoothness;
        private bool     m_Loop = false;
        private Object2D m_Object = null;

        #endregion

        #region Constructors

        /**
         * Construtor da animação alpha.
         *
         * @param To - Valor final
         * @param Time - Tempo necessário para ir de inicial até final
         * @param Smoothness - Suavidade. (0 - Linear, 1 - Sai devagar, anda rápido, chega devagar, 2 - Sai rápido, chega devagar, 3 - Sai devagar, chega rápido)
         * @param Loop - Animação em Loop
         */
        public AlphaAnimation2D(double To, double Time, int Smoothness = 0, bool Loop = false)
        {
            m_From = double.NaN;
            m_To = To;
            m_Time = Time;
            m_Smoothness = Smoothness;
            m_Loop = Loop;
        }

        /**
         * Construtor da animação alpha.
         *
         * @param From - Valor inicial
         * @param To - Valor final
         * @param Time - Tempo necessário para ir de inicial até final
         * @param Smoothness - Suavidade. (0 - Linear, 1 - Sai devagar, anda rápido, chega devagar, 2 - Sai rápido, chega devagar, 3 - Sai devagar, chega rápido)
         * @param Loop - Animação em Loop
         */
        public AlphaAnimation2D(double From, double To, double Time, int Smoothness = 0, bool Loop = false)
        {
            m_From = From;
            m_To = To;
            m_Time = Time;
            m_Smoothness = Smoothness;
            m_Loop = Loop;
        }

        #endregion

        #region Overriden Methods

        /**
         * Verifica se a animação está ativa.
         */
        protected override bool IsActive() { return (m_CounterAlpha.Active()); }

        /**
         * Inicializa a animação
         * 
         * @param obj - O Objeto da animação.
         */
        public override void Setup(Object2D obj)
        {
            /* Salva o objeto */
            m_Object = obj;

            /* Define o contador */
            double fromAlpha = (double.IsNaN(m_From) ? obj.Alpha : m_From);
            m_CounterAlpha.Reset(fromAlpha, m_To, m_Time, m_Smoothness, m_Loop);

            /* Muda o valor do alpha */
            m_Object.Alpha = (uint)m_CounterAlpha.Value;
        }

        /**
         * Atualiza a animação.
         * 
         * @param Time - Tempo que passou.
         */
        public override void Update(double Time)
        {
            /* Atualiza o valor do alpha */
            m_CounterAlpha.Update(Time);
            m_Object.Alpha = (uint)m_CounterAlpha.Value;
        }

        #endregion
    }
}
